Decrease elements to make array zigzag¶
Time: O(N); Space: O(1); medium
Given an array nums of integers, a move consists of choosing any element and decreasing it by 1.
An array A is a zigzag array if either: * Every even-indexed element is greater than adjacent elements, ie. A[0] > A[1] < A[2] > A[3] < A[4] > … * OR, every odd-indexed element is greater than adjacent elements, ie. A[0] < A[1] > A[2] < A[3] > A[4] < …
Return the minimum number of moves to transform the given array nums into a zigzag array.
Example 1:
Input: nums = [1,2,3]
Output: 2
Explanation:
We can decrease 2 to 0 or 3 to 1.
Example 2:
Input: nums = [9,6,1,6,2]
Output: 4
Notes:
1 <= len(nums) <= 1000
1 <= nums[i] <= 1000
[1]:
class Solution1(object):
def movesToMakeZigzag(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
result = [0, 0]
for i in range(len(nums)):
left = nums[i-1] if i-1 >= 0 else float("inf")
right = nums[i+1] if i+1 < len(nums) else float("inf")
result[i % 2] += max(nums[i] - min(left, right) + 1, 0)
return min(result)
[2]:
s = Solution1()
nums = [1,2,3]
assert s.movesToMakeZigzag(nums) == 2
nums = [9,6,1,6,2]
assert s.movesToMakeZigzag(nums) == 4